"""
将链表同步到列表中
为了方便查看，我们将链表容器同步到列表容器中
"""


class SingleNode:
    '''
    链表中的一个节点，包含自身数据和下一个数据
    '''

    def __init__(self, val, next=None):
        self.val = val  # 当前节点的值
        self.next = next  # 当前节点后面节点的值

    def __repr__(self):
        return str(self.val)


class LinkedList:
    '''
    链表容器，来存放每一个节点，包含链表节点，容器头和容器尾
    容器头指向容器中第一个节点，容器尾指向容器中最后一个节点
    '''

    def __init__(self):
        self.nodes = []  # 可选项，将LinkedList链表容器同步到列表中，方便展示
        self.head = None  # 准备这个保存的是SingleNode实例
        self.tail = None  # 准备这个保存的是SingleNode实例

    def append(self, val):
        node = SingleNode(val)  # 将类SingleNode实例化，当前实例为node

        if self.tail is None:  # 如果tail是none则表示该节点是容器中第一个节点
            self.head = node  # 容器头为容器中第一个节点
        else:  # 该节点是容器中非第一个节点
            self.tail.next = node  # 将上一个节点的next设置为自己

        self.nodes.append(node)  # 将值append到列表容器中
        self.tail = node  # 重写tail为自己，为下一次append做准备。

    def iternodes(self):  # 遍历容器
        current = self.head
        while current:
            yield current
            current = current.next

a = LinkedList()
a.append(12)
a.append(13)
a.append(14)
a.append(15)
a.append(16)

print(a.__dict__)
for x in a.iternodes():
    print(x)

print(a.nodes)

"""
注意：
1.代码中可以不需要列表容器代码。
2.对于容器的选择，如果只是单纯的追加的方式，那么列表是个比较好的选择；如果需要增加中间插入或者删除方式，列表不合适。
"""